1 /*
2 * Angkor Web Framework
3 *
4 * Distributable under LGPL license.
5 * See terms of license at gnu.org.
6 */
7 package com.tirsen.angkor.beans;
8
9 import com.tirsen.angkor.event.ChangeListener;
10 import com.tirsen.angkor.event.ChangeSource;
11 import com.tirsen.angkor.event.ChangeSourceHelper;
12 import com.tirsen.angkor.widget.ValueModel;
13
14 import java.io.Serializable;
15 import java.util.StringTokenizer;
16
17
18 /***
19 * A BeanModel acts as the proxy for JavaBean instances which may or may not actually
20 * exist enabling them to be lazily evaluated only when a view actually requests the value
21 * of the JavaBean. Useful when creating views which should be bound to properties of JavaBeans
22 * but the view is not yet visible and the JavaBean is not yet instantiated. Also has a lot of
23 * utility methods for creating various models bound to the JavaBean so it may be useful even if
24 * the JavaBean actually exists. For this reason the name <code>BeanModel</code> may be a little bit
25 * inaccurate, maybe <code>BeanModel</code> may be better.
26 *
27 * <!-- $Id: BeanModel.java,v 1.2 2002/10/09 21:37:37 tirsen Exp $ -->
28 *
29 * @author $Author: tirsen $
30 * @version $Revision: 1.2 $
31 */
32 public class BeanModel implements Serializable, ChangeSource
33 {
34 private Object valueObject;
35 private ValueModel model;
36 private Class objectClass;
37 private ChangeSourceHelper changeSourceHelper = new ChangeSourceHelper(this);
38
39 public BeanModel(Class objectClass)
40 {
41 this.objectClass = objectClass;
42 }
43
44 public BeanModel(ValueModel model)
45 {
46 this.model = model;
47 }
48
49 public BeanModel(Object valueObject)
50 {
51 setBean(valueObject);
52 }
53
54 public void setBean(Object valueObject)
55 {
56 this.valueObject = valueObject;
57 changeSourceHelper.signalChangeEvent();
58 }
59
60 public Object getBean()
61 {
62 Object object = valueObject;
63 if (object == null && model != null) object = model.getValue();
64 return object;
65 }
66
67 public Class getObjectClass()
68 {
69 Class klass = objectClass;
70 if (klass == null && valueObject != null) klass = valueObject.getClass();
71 if (klass == null && model != null) klass = model.getValueClass();
72 return klass;
73 }
74
75 public BeanTableModel getTable(String expression)
76 {
77 return getTable(expression, null);
78 }
79
80 public BeanTableModel getTable(String expression, Class propertyClass)
81 {
82 PropertySpec spec = parseExpression(expression);
83 return new PropertyTableModel(spec.getBean(), spec.getProperty(), propertyClass);
84 }
85
86 private static class PropertySpec
87 {
88 private BeanModel bean;
89 private String property;
90
91 public PropertySpec(BeanModel bean, String property)
92 {
93 this.bean = bean;
94 this.property = property;
95 }
96
97 public BeanModel getBean()
98 {
99 return bean;
100 }
101
102 public String getProperty()
103 {
104 return property;
105 }
106 }
107
108 public ValueModel getValue(String expression)
109 {
110 PropertySpec parsed = parseExpression(expression);
111 return new PropertyValueModel(parsed.getBean(), parsed.getProperty());
112 }
113
114 public PropertySpec parseExpression(String expression)
115 {
116 StringTokenizer tokens = new StringTokenizer(expression, ".", false);
117 BeanModel current = this;
118 PropertySpec spec = new PropertySpec(this, expression);
119 while (tokens.hasMoreElements())
120 {
121 String property = tokens.nextToken();
122 if (tokens.hasMoreElements())
123 current = current.getPropertyBean(property);
124 else
125 spec = new PropertySpec(current, property);
126 }
127 return spec;
128 }
129
130 private BeanModel getPropertyBean(String property)
131 {
132 return new BeanModel(new PropertyValueModel(this, property));
133 }
134
135 public BeanModel getBean(String expression)
136 {
137 PropertySpec parsed = parseExpression(expression);
138 return parsed.getBean().getPropertyBean(parsed.getProperty());
139 }
140
141 public void addChangeListener(ChangeListener listener)
142 {
143 changeSourceHelper.addChangeListener(listener);
144 }
145
146 public void removeChangeListener(ChangeListener listener)
147 {
148 changeSourceHelper.removeChangeListener(listener);
149 }
150 }
This page was automatically generated by Maven